# -*- coding: utf-8 -*-
# @Time    : 2020/4/29 20:53
# @Author  : Weymouth
# @Email   : 261229090@qq.com
# @File    : studentsystem.py
# @Software: PyCharm
# ---------------------------------------------------

import re, os

# filename = r"E:\test_platform\study\练习项目\student.txt"

def main():
    ctrl = True     # 标记是否退出系统
    while(ctrl):
        menu()     # 显示菜单
        option = input("请选择：")      # 选择菜单项
        option_str = re.sub("\D", "", option)   # 提取数字
        if option_str in ['0', '1', '2', '3', '4', '5', '6', '7']:
            option_int = int(option_str)
            if option_int == 0:     # 退出系统
                print("您已退出学生信息管理系统!")
                ctrl = False
            elif option_int == 1:   # 录入学生成绩信息
                insert()
            elif option_int == 2:   # 查找学生成绩信息
                search()
            elif option_int == 3:   # 删除学生成绩信息
                delete()
            elif option_int == 4:   # 修改学生成绩信息
                modify()
            elif option_int == 5:   # 排序
                sort()
            elif option_int == 6:   # 统计学生总数
                total()
            elif option_int == 7:   # 显示所有学生信息
                show()

def menu():
    # 输出菜单
    print('''
    |------------------学生信息管理系统--------------------|
    |                                                   |
    |   ==================功能菜单==================      |
    |                                                   |
    |   1 录入学生信息                                     |
    |   2 查找学生信息                                     |
    |   3 删除学生信息                                     |
    |   4 修改学生信息                                     |
    |   5 排序                                           |
    |   6 统计学生总数                                     |
    |   7 显示所有学生信息                                  |
    |   0 退出系统                                        |
    |                                                   |
    |   ===========================================     |
    |   说明：通过数字或↑↓方向键选择菜单                      |
    |---------------------------------------------------|
    ''')

# 将学生信息保存到文件
def save(student):
    try:
        student_txt = open(filename, "a")   # 以追加模式打开
    except Exception as e:
        student_txt = open(filename, "w")   # 文件不存在，创建文件并打开
    for info in student:
        student_txt.write(str(info) + "\n")  # 按行存储，添加换行符
    student_txt.close()                      # 关闭文件

def insert():
    studentList = []     # 保存学生信息的列表
    mark = True         # 是否继续参加
    while mark:
        id = input("请输出ID（如 1001）：")
        if not id:      # ID为空，跳出循环
            break
        name = input("请输入名字：")
        if not name:    # 名字为空，跳出循环
            break
        try:
            english = int(input("请输入英语成绩："))
            python = int(input("请输入Python成绩："))
            c = int(input("请输入C语言成绩："))
        except:
            print("输入无效，不是整型数值......重新录入信息")
            continue
        # 将输入的学生信息保存到字典
        stdent = {"id": id, "name": name, "english": english, "python": python, "c": c}
        studentList.append(stdent)   # 将学生字典添加到列表中
        inputMark = input("是否继续添加？（y/n）：")
        if inputMark == "y":        # 继续添加
            mark = True
        else:
            mark = False            # 不继续参加
    save(studentList)        # 将学生信息保存到文件
    print("学生信息录入完毕！！！")

def delete():
    mark = True                                     # 标识是否循环
    while mark:
        studentID = input("请输入要删除的学生ID：")
        if studentID is not "":                     # 判断是否输入要删除的学生
            if os.path.exists(filename):            # 判断文件是否存在
                with open(filename, 'r') as rfile:  # 打开文件
                    student_old = rfile.readlines() # 读取全部内容
            else:
                student_old = []
            ifdel = False                           # 标记是否删除
            if student_old:                         # 如果存在学生信息
                with open(filename, "w") as wfile:  # 以写的方式打开文件
                    d = {}                          # 定义空字典
                    for list in student_old:
                        d = dict(eval(list))        # 字符串转字典
                        if d["id"] != studentID:
                            wfile.write(str(d) + "\n")      # 将一条学生信息写入文件
                        else:
                            ifdel = True            # 标记已删除
                    if ifdel:
                        print("ID为 %s 的学生信息已被删除..." % studentID)
                    else:
                        print("没有找到ID为 %s 的学生信息..." % studentID)

        else:
            print("无学生信息...")
            break                                   # 退出循环
        show()                                      # 展示所有学生信息
        inputMark = input("是否继续删除？（y/n）：")
        if inputMark == "y":
            mark = True                             # 继续删除
        else:
            mark = False                            # 退出删除学生信息功能

def modify():
    show()                                          # 显示全部学生信息
    if os.path.exists(filename):                    # 判断文件是否存在
        with open(filename, "r") as rfile:          # 打开文件
            student_old = rfile.readlines()         # 读取全部内容
    else:
        return
    studentid = input("请输入要修改的学生ID：")
    with open(filename, "w") as wfile:              # 以只写模式打开文件
        for student in student_old:
            d = dict(eval(student))                 # 字符串转字典
            if d["id"] == studentid:                # 是否为要修改的学生
                print("找到了这名学生，可以修改他的信息！")
                while True:                         # 输入要修改的信息
                    try:
                        d["name"] = input("请输入姓名：")
                        d["english"] = int(input("请输入英语成绩："))
                        d["python"] = int(input("请输入python成绩："))
                        d["c"] = int(input("请输入c成绩："))
                    except:
                        print("您的输入有误，请重新输入")
                    else:
                        break                       # 跳出循环
                student = str(d)                    # 将字典转换为字符串
                wfile.write(student + "\n")         # 将修改的信息写入到文件
                print("修改成功！")
            else:
                wfile.write(student)                # 将未修改的信息写入到文件
    mark = input("是否继续修改其他学生信息？（y/n）：")
    if mark == "y":
        modify()                                    # 重新执行修改操作

def search():
    mark = True
    student_query = []      #保存查询结果的学生列表
    while mark:
        id = ""
        name = ""
        if os.path.exists(filename):                #判断文件是否存在
            mode = input("按ID查输入1；按姓名查输入2：")
            if mode == "1":                         #按学生编号查询
                id = input("请输入学生ID：")
            elif mode == "2":                         #按学生姓名查询
                name = input("请输入学生姓名：")
            else:
                print("您的输入有误，请重新输入！")
                search()                            #重新查询
            with open(filename, "r") as file:       #打开文件
                student = file.readlines()          #读取全部内容
                for list in student:
                    d = dict(eval(list))            #字符串转字典
                    if id is not "":                #判断是否按ID查询
                        if d['id'] == id:
                            student_query.append(d) #将找到的学生信息保存到列表中
                    elif name is not "":            #判断是否按姓名查询
                        if d['name'] == name:
                            student_query.append(d) #将找到的学生信息保存到列表中
                show_student(student_query)         #显示查询结果
                student_query.clear()               #清空列表
                inputMark = input("是否继续查询？（y/n）：")
                if inputMark == "y":
                    mark = True
                else:
                    mark = False
        else:
            print("暂未保存数据信息。。。")
            return

#将保存在列表中的学生信息显示出来
def show_student():
    if not studentList:                             #如果没有显示数据
        print("（o@.@o）无数据信息（o@.@o） \n")
        return
    #定义标题显示格式
    format_title = "{:^6}{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^10}"
    print(format_title.format("ID", "名字", "英语成绩", "Python成绩", "C语言成绩", "总成绩"))  #按指定格式显示标题
    #定义具体内容显示格式
    format_data = "{:^6}{:^12}\t{:^12}\t{:^12}\t{:^12}\t{:^12}"
    for info in studentList:                        # 通过for循环将列表中的数据全部显示出来
        print(format_data.format(info.get("id"),
                                 info.get("name"),
                                 str(info.get("english")),
                                 str(info.get("python")),
                                 str(info.get("c")),
                                 str(info.get("english") + info.get("python") + info.get("c")).center(12)))

def total():
    if os.path.exists(filename):                    #判断文件是否存在
        with open(filename, "r") as rfile:          #打开文件
            student_old = rfile.readlines()         #读取全部内容
            if student_old:
                print("一共 %d 名学生！" % len(student_old))  #统计学生人数
            else:
                print("还没有录入学生信息")
    else:
        print("暂未保存数据信息。。。")

def show():
    student_new = []
    if os.path.exists(filename):                    #判断文件是否存在
        with open(filename, 'r') as rfile:          #打开文件
            student_old = rfile.readlines()         #读取全部内容
        for list in student_old:
            student_new.append(eval(list))          #将找到的学生信息保存到列表中
        if student_new:
            show_student(student_new)
    else:
        print("暂未保存数据信息")

def sort():
    show()                                          #显示全部学生信息
    if os.path.exists(filename):                    #判断文件是否存在
        with open(filename, 'r') as file:           #以只读模式打开文件
            student_old = file.readlines()          #读取全部内容
            student_new = []
        for list in student_old:
            d = dict(eval(list))                    #字符串转字典
            student_new.append(d)                   #将转换后的字典添加到列表中
    else:
        return
    ascORdesc = input("请选择（0升序；1降序）：")
    if ascORdesc == "0":                            #按升序排序
        ascORdescBool = False
    elif ascORdesc == "1":                          #按降序排序
        ascORdescBool = True
    else:
        print("您的输入有误，请重新输入！")
        sort()
    mode = input("请选择排序方式（1按英语成绩排序；2按Python成绩排序；3按C语言成绩排序；0按总成绩排序）：")
    if mode == "1":                                 #按英语成绩排序
        student_new.sort(key=lambda x: x["english"], reverse=ascORdescBool)
    elif mode == "2":
        student_new.sort(key=lambda x: x["python"], reverse=ascORdescBool)
    elif mode == "3":
        student_new.sort(key=lambda x: x["c"], reverse=ascORdescBool)
    elif mode == "0":
        student_new.sort(key=lambda x: x["english"] + x["python"] + x["c"], reverse=ascORdescBool)
    else:
        print("您的输入有误，请重新输入！")
        sort()
    show_student(student_new)                       #显示排序结果